]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
loginDialog: Allow timed login with disabled user list
authorRay Strode <rstrode@redhat.com>
Tue, 13 Apr 2021 14:59:49 +0000 (10:59 -0400)
committerRay Strode <rstrode@redhat.com>
Fri, 23 Apr 2021 20:00:39 +0000 (16:00 -0400)
At the moment the timed login feature is implemented in the user list.
If there's no user list, we don't show the indicator anywhere and
don't proceed with timed login.

This commit allows timed login to work when the user list is disabled.
It accomplishes this by putting the timed login indicator on the
auth prompt in that scenario.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1809>

data/theme/gnome-shell-sass/widgets/_login-dialog.scss
js/gdm/authPrompt.js
js/gdm/loginDialog.js

index d6608fc30703c4ea803fb36fec0cf1dac422e347..1789beca92f0d46f758a0ff70fc13c13a6cede86 100644 (file)
   padding-top: 16px;
 }
 
+.login-dialog-timed-login-indicator {
+    height: 2px;
+    background-color: darken($fg_color,40%);
+}
+
 .login-dialog-prompt-layout {
   padding-top: 24px;
   padding-bottom: 12px;
index d2c9a165949a1b09df67754b5476c61692f5e2d8..de777450e7a9d3ffc3d0fa940e9ae67f7b84ff7b 100644 (file)
@@ -1,7 +1,7 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 /* exported AuthPrompt */
 
-const { Clutter, GObject, Pango, Shell, St } = imports.gi;
+const { Clutter, GLib, GObject, Pango, Shell, St } = imports.gi;
 
 const Animation = imports.ui.animation;
 const Batch = imports.gdm.batch;
@@ -170,6 +170,13 @@ var AuthPrompt = GObject.registerClass({
         this._mainBox.add_child(this._entry);
         this._entry.grab_key_focus();
 
+        this._timedLoginIndicator = new St.Bin({
+            style_class: 'login-dialog-timed-login-indicator',
+            scale_x: 0,
+        });
+
+        this.add_child(this._timedLoginIndicator);
+
         [this._textEntry, this._passwordEntry].forEach(entry => {
             entry.clutter_text.connect('text-changed', () => {
                 if (!this._userVerifier.hasPendingMessages)
@@ -198,6 +205,40 @@ var AuthPrompt = GObject.registerClass({
         this._defaultButtonWell.add_child(this._spinner);
     }
 
+    showTimedLoginIndicator(time) {
+        let hold = new Batch.Hold();
+
+        this.hideTimedLoginIndicator();
+
+        const startTime = GLib.get_monotonic_time();
+
+        this._timedLoginTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 33,
+            () => {
+                const currentTime = GLib.get_monotonic_time();
+                const elapsedTime = (currentTime - startTime) / GLib.USEC_PER_SEC;
+                this._timedLoginIndicator.scale_x = elapsedTime / time;
+                if (elapsedTime >= time) {
+                    this._timedLoginTimeoutId = 0;
+                    hold.release();
+                    return GLib.SOURCE_REMOVE;
+                }
+
+                return GLib.SOURCE_CONTINUE;
+            });
+
+        GLib.Source.set_name_by_id(this._timedLoginTimeoutId, '[gnome-shell] this._timedLoginTimeoutId');
+
+        return hold;
+    }
+
+    hideTimedLoginIndicator() {
+        if (this._timedLoginTimeoutId) {
+            GLib.source_remove(this._timedLoginTimeoutId);
+            this._timedLoginTimeoutId = 0;
+        }
+        this._timedLoginIndicator.scale_x = 0.;
+    }
+
     _activateNext(shouldSpin) {
         this.verificationStatus = AuthPromptStatus.VERIFICATION_IN_PROGRESS;
         this.updateSensitivity(false);
index cbc23c56d220cde36602608f386eeb5edb6d4dfc..d2a82b43d1d18593bdeab7f26c92b82e4341f4ac 100644 (file)
@@ -762,6 +762,9 @@ var LoginDialog = GObject.registerClass({
 
             if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
                 this._authPrompt.reset();
+
+            if (this._disableUserList && this._timedLoginUserListHold)
+                this._timedLoginUserListHold.release();
         }
     }
 
@@ -1049,16 +1052,29 @@ var LoginDialog = GObject.registerClass({
         let animationTime;
 
         let tasks = [
-            () => this._waitForItemForUser(userName),
+            () => {
+                if (this._disableUserList)
+                    return;
+
+                this._timedLoginUserListHold = this._waitForItemForUser(userName);
+            },
 
             () => {
-                loginItem = this._userList.getItemFromUserName(userName);
+                this._timedLoginUserListHold = null;
+
+                if (this._disableUserList)
+                    loginItem = this._authPrompt;
+                else
+                    loginItem = this._userList.getItemFromUserName(userName);
 
                 // If there is an animation running on the item, reset it.
                 loginItem.hideTimedLoginIndicator();
             },
 
             () => {
+                if (this._disableUserList)
+                    return;
+
                 // If we're just starting out, start on the right item.
                 if (!this._userManager.is_loaded)
                     this._userList.jumpToItem(loginItem);
@@ -1080,6 +1096,9 @@ var LoginDialog = GObject.registerClass({
             },
 
             () => {
+                if (this._disableUserList)
+                    return;
+
                 // If idle timeout is done, make sure the timed login indicator is shown
                 if (delay > _TIMED_LOGIN_IDLE_THRESHOLD &&
                     this._authPrompt.visible)